/**
 * 角色常量定义
 * 与后端 RoleConstants.java 保持一致
 * 
 * @author AI Assistant
 * @version 1.0
 * @since 2025-01-25
 */

// ========== 标准角色名称（与后端枚举值对应） ==========
export const ROLE_CONSTANTS = {
  /** 系统管理员 */
  ADMIN: 'ADMIN',
  /** 客服人员 */
  AGENT: 'AGENT',
  /** 客户 */
  CUSTOMER: 'CUSTOMER',
  /** 客服主管 */
  SUPERVISOR: 'SUPERVISOR',
  /** 只读用户 */
  READONLY: 'READONLY'
}

// ========== 角色显示名称（用于UI展示） ==========
export const ROLE_DISPLAY_NAMES = {
  [ROLE_CONSTANTS.ADMIN]: '系统管理员',
  [ROLE_CONSTANTS.AGENT]: '客服人员',
  [ROLE_CONSTANTS.CUSTOMER]: '客户',
  [ROLE_CONSTANTS.SUPERVISOR]: '客服主管',
  [ROLE_CONSTANTS.READONLY]: '只读用户'
}

// ========== 小写形式（用于API交互和前端内部使用） ==========
export const ROLES = {
  ADMIN: 'admin',
  AGENT: 'agent',
  CUSTOMER: 'customer',
  SUPERVISOR: 'supervisor',  // 注意：不再使用 manager
  READONLY: 'readonly'
}

// ========== 角色权限级别（数值越大权限越高） ==========
export const ROLE_LEVELS = {
  [ROLES.READONLY]: 1,
  [ROLES.CUSTOMER]: 2,
  [ROLES.AGENT]: 3,
  [ROLES.SUPERVISOR]: 4,
  [ROLES.ADMIN]: 5
}

// ========== 角色描述 ==========
export const ROLE_DESCRIPTIONS = {
  [ROLES.ADMIN]: '拥有所有权限，可以管理系统的所有功能',
  [ROLES.AGENT]: '可以处理工单和客户服务',
  [ROLES.CUSTOMER]: '可以创建工单和查看自己的工单',
  [ROLES.SUPERVISOR]: '可以管理客服人员和查看统计数据',
  [ROLES.READONLY]: '只能查看数据，不能修改'
}

// ========== 工具方法 ==========

/**
 * 验证角色是否有效
 * @param {string} role - 角色名称
 * @returns {boolean}
 */
export function isValidRole(role) {
  if (!role) return false
  const upperRole = role.toUpperCase()
  return Object.values(ROLE_CONSTANTS).includes(upperRole)
}

/**
 * 获取角色显示名称
 * @param {string} role - 角色名称（大小写不敏感）
 * @returns {string}
 */
export function getRoleDisplayName(role) {
  if (!role) return '未知角色'
  const upperRole = role.toUpperCase()
  return ROLE_DISPLAY_NAMES[upperRole] || '未知角色'
}

/**
 * 获取角色描述
 * @param {string} role - 角色名称
 * @returns {string}
 */
export function getRoleDescription(role) {
  if (!role) return '未知角色'
  const lowerRole = role.toLowerCase()
  return ROLE_DESCRIPTIONS[lowerRole] || '未知角色'
}

/**
 * 比较角色权限级别
 * @param {string} role1 - 角色1
 * @param {string} role2 - 角色2
 * @returns {number} 正数表示role1权限高，负数表示role2权限高，0表示相同
 */
export function compareRoleLevel(role1, role2) {
  const level1 = ROLE_LEVELS[role1?.toLowerCase()] || 0
  const level2 = ROLE_LEVELS[role2?.toLowerCase()] || 0
  return level1 - level2
}

/**
 * 检查角色是否有足够权限
 * @param {string} userRole - 用户角色
 * @param {string} requiredRole - 需要的角色
 * @returns {boolean}
 */
export function hasRoleLevel(userRole, requiredRole) {
  return compareRoleLevel(userRole, requiredRole) >= 0
}

/**
 * 将角色转换为大写
 * @param {string} role - 角色名称
 * @returns {string}
 */
export function toUpperCaseRole(role) {
  return role?.toUpperCase() || ''
}

/**
 * 将角色转换为小写
 * @param {string} role - 角色名称
 * @returns {string}
 */
export function toLowerCaseRole(role) {
  return role?.toLowerCase() || ''
}

/**
 * 获取所有角色列表
 * @returns {Array<{value: string, label: string, description: string}>}
 */
export function getAllRoles() {
  return Object.entries(ROLES).map(([key, value]) => ({
    value: value,
    label: ROLE_DISPLAY_NAMES[ROLE_CONSTANTS[key]],
    description: ROLE_DESCRIPTIONS[value],
    level: ROLE_LEVELS[value]
  }))
}

/**
 * 检查角色是否为管理员类型（ADMIN 或 SUPERVISOR）
 * @param {string} role - 角色名称
 * @returns {boolean}
 */
export function isManagerRole(role) {
  const lowerRole = role?.toLowerCase()
  return lowerRole === ROLES.ADMIN || lowerRole === ROLES.SUPERVISOR
}

/**
 * 检查角色是否为客服类型（AGENT 或 SUPERVISOR）
 * @param {string} role - 角色名称
 * @returns {boolean}
 */
export function isAgentRole(role) {
  const lowerRole = role?.toLowerCase()
  return lowerRole === ROLES.AGENT || lowerRole === ROLES.SUPERVISOR
}

// 默认导出
export default {
  ROLE_CONSTANTS,
  ROLE_DISPLAY_NAMES,
  ROLES,
  ROLE_LEVELS,
  ROLE_DESCRIPTIONS,
  isValidRole,
  getRoleDisplayName,
  getRoleDescription,
  compareRoleLevel,
  hasRoleLevel,
  toUpperCaseRole,
  toLowerCaseRole,
  getAllRoles,
  isManagerRole,
  isAgentRole
}

